今天來講解一下昨天的程式碼,
MainActivity.java
onClcik(view v)事件
startActivityForResult(intent, ACTIVITY_REPORT);
我們在呼叫另一個Activity時,改採用startActivityForResult方法,傳入一個Intent類別,並指定一個呼叫這個Activity的識別碼,Android框架會找出合適的Activity,並傳送Intent給這個Activity來負責處理
onActivityResult函式
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent)
{
super.onActivityResult(requestCode, resultCode, intent);
if(resultCode == RESULT_OK)
{
if(requestCode == ACTIVITY_REPORT)
{
Bundle bundle = intent.getExtras();
String bmi = bundle.getString("BMI");
show_suggest.setText(getString(R.string.advice_history) + bmi);
num_weight.setText(R.string.input_empty);
num_weight.requestFocus();
}
}
}
在負責呼叫的Activity中,加入處理返回代碼的onActivityResult方法。onActivityResult傳入三個參數
requestCode:呼叫該Activity時使用的識別碼
resultCode:該Activity傳回的回傳瑪
intent:該Activity傳回的Intent類別資料
onActivityResult函式與startActivityForResult函式是共生的關係,startActivityForResult函式負責呼叫其他Activity,而onActivityResult函式來處理被呼叫的Activity所傳回的資訊
當被呼叫的Activity完成工作時,就會通知負責呼叫的Activity,負責呼叫的Activity會使用onActivityResult函式來處理被呼叫的Activity所傳回的訊息
onActivityResult函式會根據收到的requestCode來判斷是哪個呼叫的Activity傳回的資料,這裡傳進來的requestCode就是我們啟動另一個Activity時使用的識別碼。
之後根據resultCode的結果來做後續處理,Android內建定義的有RESULT_OK、RESULT_CANCELLED兩種resultCode。但其實resultCode只是數字而已,我們也可以自行定義,好讓接收結果的一端的程式,能根據更多的結果狀態來做出反應。
以下是每一行的解說
Bundle bundle = intent.getExtras();
從Intent中取出Bundle
String bmi = bundle.getString("BMI");
從bundle中取出BMI值
show_suggest.setText(getString(R.string.advice_history) + bmi);
在show_suggest介面元件中顯示BMI值
num_weight.setText(R.string.input_empty);
清空體重輸入欄
num_weight.requestFocus();
把預設的遊標指向體重輸入欄,方便使用者做下一次輸入
ReportActivity.java
setResult(RESULT_OK, intent);
代表回傳OK的結果,並傳一個Intent回到原本呼叫的MainActivity,這個Intent帶有BMI值的計算結果